Release 10.1A: OpenEdge Development:
Messaging and ESB


TempTableMessage

OpenEdge applications use temp-tables for data. The new TempTableMessage supports using temp-tables for JMS messaging. The XMLMessage is the basis for the TempTableMessage. A non-OpenEdge application receives a TempTableMessage as an XMLMessage. The JMS header property signals an OpenEdge application that the incoming message is a TempTableMessage.

For more information on accessing the examples files, see the "Example procedures" section.

For an alphabetical API reference, see Appendix A "4GL-JMS API Reference."

The following example shows sending a TempTableMessage:

ttmgs_send.p
DEFINE VARIABLE ptp AS LOGICAL INITIAL FALSE. 
DEFINE VARIABLE sessionH AS HANDLE. 
DEFINE VARIABLE messageH AS HANDLE. 
DEFINE TEMP-TABLE tcust LIKE customer. 
DEFINE VARIABLE numRecs AS INT INITIAL 0. 
DEFINE VARIABLE ttH AS HANDLE. 
/* Creates a session object. */ 
RUN  jms/jmssession.p PERSISTENT SET sessionH ("-SMQConnect"). 
RUN setBrokerURL IN sessionH ("localhost:2506"). 
RUN beginSession IN sessionH. 
FOR EACH customer NO-LOCK: 
        CREATE tcust. 
        tcust.CustNum = customer.CustNum. 
        tcust.NAME = customer.Name. 
        tcust.Address = customer.Address. 
        tcust.Address = customer.Address2. 
        tcust.City = customer.City. 
        tcust.State = customer.State. 
        tcust.PostalCode = customer.PostalCode. 
        tcust.Country = customer.Country. 
        numRecs = numRecs + 1. 
END. 
ttH = TEMP-TABLE tcust:HANDLE. 
RUN createTemptableMessage in sessionH(OUTPUT messageH). 
RUN setTempTable IN messageH( ttH, ?, TRUE). 
IF ptp THEN 
    RUN sendToQueue IN sessionH ("SampleQ1", messageH, ?, ?, ?).     
ELSE 
    RUN PUBLISH IN sessionH ("TestTopic", messageH, ?, ?, ?). 
RUN deleteMessage IN messageH. 
delete tcust. 
MESSAGE "Number of records processed: " + string(numRecs). 
RUN createTextMessage in sessionH(OUTPUT messageH). 
RUN setText IN messageH(string(numRecs)). 
IF ptp THEN 
    RUN sendToQueue IN sessionH ("SampleQ1", messageH, ?, ?, ?).     
ELSE 
    RUN PUBLISH IN sessionH ("TestTopic", messageH, ?, ?, ?). 
RUN deleteMessage IN messageH. 
RUN deleteSession IN sessionH. 

The following example shows receiving a TempTableMessage:

ttmsg_recv.p
DEFINE VARIABLE ptp AS LOGICAL INITIAL FALSE. 
DEFINE VARIABLE sessionH AS HANDLE NO-UNDO. 
DEFINE VARIABLE msgConsumer AS HANDLE NO-UNDO. 
DEFINE VARIABLE mesgH AS HANDLE NO-UNDO. 
DEFINE VARIABLE stillWaiting AS LOGICAL INIT yes. 
DEFINE VARIABLE numRecsRead AS INT NO-UNDO INITIAL 0. 
RUN jms/jmssession.p PERSISTENT SET sessionH ("-SMQConnect"). 
RUN setBrokerURL IN sessionH ("localhost:2506"). 
RUN beginSession IN sessionH. 
RUN createMessageConsumer IN sessionH ( 
                              THIS-PROCEDURE,    /* This proc will handle it */ 
                             "messageHandler", /* name of internal procedure */ 
                              OUTPUT msgConsumer). 
IF ptp THEN 
    RUN receiveFromQueue IN sessionH ("SampleQ1", ?, msgConsumer). 
ELSE 
    RUN subscribe IN sessionH ("TestTopic", 
                                ?, /* durable subscription */ 
                                ?, /* No message selector */ 
                                YES, /* Want to get my own publications */ 
                                msgConsumer). 
RUN startReceiveMessages IN sessionH. 
RUN waitForMessages IN sessionH ("inWait", THIS-PROCEDURE, ?). 
RUN deleteSession IN sessionH. 
MESSAGE "Number of records processed: " + STRING(numRecsRead). 
PROCEDURE messageHandler: 
DEFINE INPUT PARAMETER messageH AS HANDLE NO-UNDO. 
DEFINE INPUT PARAMETER messageConsumerH AS HANDLE NO-UNDO. 
DEFINE OUTPUT PARAMETER autoReplyH AS HANDLE NO-UNDO. /* Not used in this 
example */ 
DEFINE VARIABLE ttH1 AS HANDLE NO-UNDO. 
DEFINE VARIABLE bh1 AS HANDLE NO-UNDO. 
DEFINE VARIABLE bh2 AS HANDLE NO-UNDO. 
DEFINE VARIABLE qh1 AS HANDLE NO-UNDO. 
if DYNAMIC-FUNCTION("getMessageType" in messageH) = "TemptableMessage" THEN 
DO: 
    ttH1 = DYNAMIC-FUNCTION("getTempTable" IN messageH, ?, ?, ?). 
    numRecsRead = numRecsRead + 1. 
    bh1 = tth1:DEFAULT-BUFFER-HANDLE. 
    create query qh1. 
    qh1:SET-BUFFERS(bh1). 
    qh1:query-prepare("for each tcust"). 
    qh1:query-open(). 
    qh1:get-first. 
    REPEAT WHILE NOT qh1:QUERY-OFF-END: 
       bh2 = bh1:buffer-field("name"). 
       MESSAGE bh2:string-value(). 
       qh1:GET-NEXT. 
       DELETE OBJECT bh2. 
    END. 
    qh1:query-close. 
    DELETE OBJECT ttH1. 
    DELETE OBJECT qh1. 
    END. 
ELSE 
    stillWaiting = no. 
RUN deleteMessage IN messageH. 
END PROCEDURE. 
FUNCTION inWait RETURNS LOGICAL. 
RETURN stillWaiting. 
END. 


Copyright © 2005 Progress Software Corporation
www.progress.com
Voice: (781) 280-4000
Fax: (781) 280-4095